using UnityEngine;
using QFramework;
using QFramework.Example;
using System.Linq;
using JetBrains.Annotations;
using System.Threading;

namespace ProjectSurvivor
{
	public partial class SimpleSword : ViewController
	{
		//当前秒数
		private float mCurrentSeconds = 0;
		void Update()
		{
			mCurrentSeconds += Time.deltaTime;
			//达到简单能力持续时间
			if (mCurrentSeconds >= Global.SimpleAbilityDuration.Value)
			{
				mCurrentSeconds = 0;
				//超级剑
				var countTimes=Global.SuperSword.Value?2:1;
				//超级剑伤害次数
				var damageTimes=Global.SuperSword.Value?Random.Range(2,3+1):1;
				//超级剑距离次数
				var distanceTimes=Global.SuperSword.Value?2:1;
				//Include: 查找处于激活和非激活状态的对象。
				//Exclude: 只查找处于激活状态的对象。
				//查找敌人                             只查找激活状态的对象。                     保持默认顺序
				var enemies = FindObjectsByType<Enemy>(FindObjectsInactive.Exclude, FindObjectsSortMode.None);
				foreach (var enemy in enemies
				//OrderBy 根据距离排序
				.OrderBy(e=>e.Direction2DFrom(Player.Default).magnitude)
				//如果敌人到玩家的方向长度<简单剑范围*距离次数
				.Where(e=>e.Direction2DFrom(Player.Default).magnitude<Global.SimpleSwordRange.Value*distanceTimes)
				//用于从序列的开头获取指定数量的元素。  刀数量+额外飞行物体数量
				.Take((Global.SimpleSwordCount.Value+Global.AdditionalFlyThingCount.Value)  * countTimes))
				{
						Sword.Instantiate()
						.Position(enemy.Position() + Vector3.left * 0.25f)
						.Show()
						.Self((self) =>
						{
							var selfCache = self;
							selfCache.OnTriggerEnter2DEvent(collider2D =>
							{
								var hurtBox = collider2D.GetComponent<HitHurtBox>();
								if (hurtBox)
								{
									if (hurtBox.Owner.CompareTag("Enemy"))
									{
										DamageSystem.CalculateDamage(Global.SimpleAbilityDamage.Value*damageTimes,
									hurtBox.Owner.GetComponent<Enemy>());
									}
								}
							}).UnRegisterWhenGameObjectDestroyed(gameObject);
							//劈砍动画
							ActionKit                                      
							.Sequence()/// 创建一个顺序执行的动画序列
							.Callback(() => { selfCache.enabled = false; })/// 在动画开始时禁用对象
							//用于并行处理的方法，可以同时执行多个任务
							.Parallel(p =>
							{
							//并行动画
							// 	self.transform.localEulerAngles = selfCache.transform.localEulerAngles.Z(z);
							// 旋转动画：0度到10度，持续0.2秒
								p.Lerp(0, 10, 0.2f, (z) =>selfCache.LocalEulerAnglesZ(z));
	
								p.Append(ActionKit.Sequence().Lerp(0, 1.25f, 0.1f, scale => selfCache.LocalScale(scale)))
								.Lerp(1.25f, 1, 0.1f, scale => selfCache.LocalScale(scale));
							})
							.Callback(() => { selfCache.enabled = true; })
							.Parallel(p =>
							{
								// // 旋转动画：10度到-180度，持续0.2秒
								p.Lerp(10, -180, 0.2f, z =>selfCache.LocalEulerAnglesZ(z));
								//   // 缩放动画：再次放大缩小
								p.Append(ActionKit.Sequence()
									.Lerp(1, 1.25f, 0.1f, scale => selfCache.LocalScale(scale)))
									.Lerp(1.25f, 1f, 0.1f, scale => selfCache.LocalScale(scale));
							})
							.Callback(() => { selfCache.enabled = false; })
							//  旋转回0度，同时根据旋转角度调整缩放
							.Lerp(-180, 0, 0.3f, z =>
							{
								// selfCache.transform.localEulerAngles = selfCache.transform.localEulerAngles.Z(z);
								        //设置 Z 轴旋转角度     设置缩放比例
								selfCache.LocalEulerAnglesZ(z).LocalScale(z.Abs() / 180);
							})
							// 开始动画
							.Start(this, () =>
							{
								selfCache.DestroyGameObjGracefully();
							});
						});


					// }
				}
				;
			}

		}
	}
}


